package com.jingdianjichi.wx.controller;

import com.jingdianjichi.wx.handler.WxChatMsgFactory;
import com.jingdianjichi.wx.handler.WxChatMsgHandler;
import com.jingdianjichi.wx.utils.MessageUtil;
import com.jingdianjichi.wx.utils.SHA1;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Map;

@RestController
@Slf4j
public class CallBackController {
    private static  final String token="adwidhaidwoaid";
    private static final String CACHE_KEY_SEPARATOR = ".";
    @Resource
    private WxChatMsgFactory wxChatMsgFactory;
    @RequestMapping("/test")
    public String test(){
        return "hello world";
    }

    /**
     * 回调消息校验
     * @return
     */
    @GetMapping("/callback")
    public String callback(@RequestParam("signature") String signature,
                           @RequestParam("timestamp") String timestamp,
                           @RequestParam("nonce") String nonce,
                           @RequestParam("echostr") String echostr){
        log.info("get验签请求参数：signature:{},timestamp:{},nonce:{},echostr:{}", signature,timestamp,nonce,echostr);
        String shaStr = SHA1.getSHA1(token, timestamp, nonce, "");
        if(signature.equals(shaStr)){
            return echostr;
        }
        return "unknown";
    }
    @PostMapping(value = "/callback",produces = "application/xml;charset=UTF-8")
    public String callback(
            @RequestBody String requestBody,
            @RequestParam("signature") String signature,
            @RequestParam("timestamp") String timestamp,
            @RequestParam("nonce") String nonce,
           @RequestParam(value = "msg_signature",required = false) String msgSignature){
        log.info("接受微信的请求：requestBody:{},signature:{},timestamp:{},nonce:{}",requestBody, signature,timestamp,nonce);
        Map<String, String> msgMap = MessageUtil.parseXml(requestBody);
        String toUserName = msgMap.get("ToUserName");
        String fromUserName = msgMap.get("FromUserName");
        String msgType=msgMap.get("MsgType");
        String event=msgMap.get("Event")==null?"":msgMap.get("Event");
        log.info("msgType:{},event:{}",msgType,event);
        StringBuilder sb=new StringBuilder();
        sb.append(msgType);
        if(!StringUtils.isEmpty(event)){
            sb.append(".");
            sb.append(event);
        }
        String msgTypeKey=sb.toString();
        WxChatMsgHandler wxChatMsgHandler = wxChatMsgFactory.getHandlerByMsgType(msgTypeKey);
        if(wxChatMsgHandler==null){
            return "unknown";
        }
        log.info("msgTypeKey:{},wxChatMsgHandler:{}",msgTypeKey,wxChatMsgHandler);
        String replyContent = wxChatMsgHandler.dealMsg(msgMap);
        log.info("replyContent:{}",replyContent);
        return replyContent;
    }
}
